package com.wqz.day19_redisdemo.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.wqz.day19_redisdemo.entity.Blog;
import com.wqz.day19_redisdemo.mapper.BlogMapper;
import com.wqz.day19_redisdemo.service.BlogService;
import com.wqz.day19_redisdemo.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

/**
 * (Blog)表服务实现类
 *
 * @author 王乾州
 * @since 2025-10-20 18:47:28
 */
@Service("blogService")
public class BlogServiceImpl implements BlogService {
    @Resource
    private BlogMapper blogMapper;
    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    public R selectBlogById(Long id) {

        // 首先从redis中查询是否有该id的博客标题,redis中的key以   b_+id储存
        ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
        String jsonStr = valueOperations.get("b_" + id);
        // 结果中返回的数据,如果查到为null,并且数据库查不到,就直接返回null,如果数据库查到,就使用查到的
        // 如果查到不为空,但是是空字符串,也是直接将 null返回
        // 如果查到正确的json字符串就去解析为Blog对象
        Blog blog = null;

        // 如果 jsonStr字符串不存在,那就需要去数据库中查询
        if(jsonStr == null) {
            blog = blogMapper.selectById(id);
            // 数据库分查询到和查询不到
            if(blog == null) {
                // 查不到,存入到redis中一个空或者默认字符串 ,防止缓存穿透,, 并给这个对象设置一个时间
                valueOperations.set("b_" + id, "", Duration.between(LocalDateTime.now(), LocalDateTime.now().plusMinutes(1)));
            } else {
                // 可以查到,将标题存入到redis中
                // 将对象转换成JSON字符串
                String jsonString = JSONObject.toJSONString(blog);
                valueOperations.set("b_" + id, jsonString, 1, TimeUnit.MINUTES);
            }

        } else {
            if(!"".equals(jsonStr)) {
                // 将json字符串解析为对象
                blog = JSONObject.parseObject(jsonStr, Blog.class);
            }
        }
        return R.success(blog);
    }
}
